package com.lipaluma.field.mapper.single.impl;

import java.io.FileNotFoundException;
import java.io.InputStream;
import java.lang.reflect.Field;
import java.util.List;
import java.util.Map;

import org.w3c.dom.Element;

import com.lipaluma.field.mapper.UnmarshalFieldMapper;
import com.lipaluma.field.mapper.mapping.FieldMappingInfo;
import com.lipaluma.io.Row;
import com.lipaluma.util.FileUtils;
import com.lipaluma.util.ReflectionUtils;

public class LookupFieldMapper implements UnmarshalFieldMapper {

	private Field field;
	private Map<String, List<Object>> objectsGrouped;
	
	private Field mainField; // pourra etre un tableau
	private Field lookupField; // pourra etre un tableau
	
	public void init(Element element, Field field) {
		// TODO Faire LookupColumn
		// récupérer la classe du field (attention, il faut gérer les types paramétrés ou les array)
		
		// pour la classe récupérée, créer un nouveau Mapper pour la classe donnée
		
		String source = null;
		// récupérer la source donnée en paramètre
		// récupérer les fields du main object en paramètre
		// récupérer les fields du Lookup Object en paramètre
		
		try {
			// Pour éviter l'écriture du path de la source dans le mapping, il faudrait pouvoir ici donner
			// un identifiant de la source et dans cas passer en paramètre de init un contexte contenant ces sources
			InputStream in = FileUtils.getInputStreamFromFilePath(source);
			// this.objectsGrouped = new_mapper.processAndGroupAllRowsBy(lookupFields, in);
			
		} catch (FileNotFoundException e) {
			e.printStackTrace();
		}
	}

	public void init(Field field) {
		// TODO Auto-generated method stub
		
	}

	public String getColumnDescription() {
		// TODO Auto-generated method stub
		return null;
	}

	public Field getField() {
		return field;
	}

	public void setField(Field field) {
		this.field = field;
	}

	public void processHeader(String columnName, int columnIndex) {
		// TODO Auto-generated method stub
		
	}

	public void unmarshall(Row row, Object target) {
		// Attention, pour faire ça, la colonne du mainField doit absolument être initialisé : 
		// Cest pourquoi, il faudra modifier l'algo du parcours des MapColumn.processRow pour lancer en dernier les LookupColumn
		Object valueId = ReflectionUtils.getField(mainField, target);
		List<Object> listObjects = objectsGrouped.get(valueId);
		ReflectionUtils.setField(field, target, listObjects); // Attention au cas où ce serait un seul objet : ne prendre que le premier élément
	}

	@Override
	public Object unmarshal(Row row) {
		// TODO Auto-generated method stub
		return null;
	}

	@Override
	public String getDescription() {
		// TODO Auto-generated method stub
		return null;
	}

	@Override
	public FieldMappingInfo[] getMappings() {
		// TODO Auto-generated method stub
		return null;
	}

}
